package com.capgemini.playingwithgooglemaps;
import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_HYBRID;
import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_NONE;
import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_NORMAL;
import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_SATELLITE;
import static com.google.android.gms.maps.GoogleMap.MAP_TYPE_TERRAIN;
import java.util.ArrayList;
import org.w3c.dom.Document;
import android.graphics.Color;
import android.graphics.Point;
import android.location.Location;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.support.v7.app.ActionBarActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMap.OnMapLongClickListener;
import com.google.android.gms.maps.Projection;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.UiSettings;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.CameraPosition;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;
public class MainActivity extends ActionBarActivity implements OnMapLongClickListener, OnItemSelectedListener {
private int kittyCounter = 1;
private ArrayList<Marker> kittyMarkers;
private GoogleMap map;
private LatLng HIOF = new LatLng(59.12797849, 11.35272861);
private LatLng FREDRIKSTAD = new LatLng(59.21047628, 10.93994737);
private LatLng myPosition = new LatLng(0,0);
private GMapV2Direction mapDirection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
kittyMarkers = new ArrayList<Marker>();
mapDirection = new GMapV2Direction();
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
map = mapFragment.getMap();
map.addMarker(new MarkerOptions().position(HIOF).title("�stfold University College"));
map.addMarker(new MarkerOptions().position(FREDRIKSTAD).title("Fredrikstad Kino"));
if (savedInstanceState == null) {
map.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(HIOF, 13, 0, 0)));
map.animateCamera(CameraUpdateFactory.newLatLng(FREDRIKSTAD), 2000, null);
}
else {
Bundle bundle = savedInstanceState.getBundle("lost_kittens");
KittenLocation kittenLocation = bundle.getParcelable("found_kitten");
map.addMarker(new MarkerOptions().position(kittenLocation.getLatLng()).title(kittenLocation.getName()).snippet("Found Kitten")
.icon(BitmapDescriptorFactory.fromResource(getResources().getIdentifier("kitten_0" + (kittyCounter % 3 + 1), "drawable", "com.capgemini.playingwithgooglemaps"))));
}
map.setOnMapLongClickListener(this);
map.setMyLocationEnabled(true);
UiSettings uiSettings = map.getUiSettings();
uiSettings.setCompassEnabled(false);
uiSettings.setTiltGesturesEnabled(false);
uiSettings.setZoomControlsEnabled(false);
Spinner spinner = (Spinner) findViewById(R.id.layers_spinner);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.layers_array, android.R.layout.simple_spinner_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (!kittyMarkers.isEmpty()) {
Marker kittyMarker = kittyMarkers.get(0);
KittenLocation kittenLocation = new KittenLocation(kittyMarker.getTitle(), new LatLng(kittyMarker.getPosition().latitude, kittyMarker.getPosition().longitude));
Bundle bundle = new Bundle();
outState.putParcelable("found_kitten", kittenLocation);
outState.putBundle("lost_kittens", bundle);
}
}
private class drawRoute extends AsyncTask<Void, Void, Document> {
Document doc;
PolylineOptions rectLine;
@Override
protected Document doInBackground(Void... params) {
doc = mapDirection.getDocument(myPosition, HIOF, GMapV2Direction.MODE_DRIVING);
ArrayList<LatLng> directionPoint = mapDirection.getDirection(doc);
rectLine = new PolylineOptions().width(3).color(Color.BLUE);
for (int i = 0; i < directionPoint.size(); i++) {
rectLine.add(directionPoint.get(i));
}
return null;
}
@Override
protected void onPostExecute(Document result) {
map.addPolyline(rectLine);
}
}
@Override
public void onMapLongClick(LatLng point) {
Marker kitty = map.addMarker(new MarkerOptions().position(point).title("Mittens the " + kittyCounter + ".").snippet("Kitty Invasion")
.icon(BitmapDescriptorFactory.fromResource(getResources().getIdentifier("kitten_0" + (kittyCounter % 3 + 1), "drawable", "com.capgemini.playingwithgooglemaps"))));
kittyMarkers.add(kitty);
kittyCounter++;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
switch (id) {
case R.id.kitty_attack:
for (Marker kittyMarker : kittyMarkers)
animateMarker(kittyMarker, FREDRIKSTAD);
break;
case R.id.draw_route:
Location myLocation = map.getMyLocation();
myPosition = new LatLng(myLocation.getLatitude(), myLocation.getLongitude());
new drawRoute().execute();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
public void animateMarker(final Marker marker, final LatLng toPosition) {
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
Projection proj = map.getProjection();
Point startPoint = proj.toScreenLocation(marker.getPosition());
final LatLng startLatLng = proj.fromScreenLocation(startPoint);
final long duration = 500;
final Interpolator interpolator = new LinearInterpolator();
handler.post(new Runnable() {
@Override
public void run() {
long elapsed = SystemClock.uptimeMillis() - start;
float t = interpolator.getInterpolation((float) elapsed / duration);
double lng = t * toPosition.longitude + (1 - t) * startLatLng.longitude;
double lat = t * toPosition.latitude + (1 - t) * startLatLng.latitude;
marker.setPosition(new LatLng(lat, lng));
if (t < 1.0) {
// Post again 16ms later.
handler.postDelayed(this, 16);
}
}
});
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
switch ((String) parent.getItemAtPosition(position)) {
case "Hybrid":
map.setMapType(MAP_TYPE_HYBRID);
break;
case "Satellite":
map.setMapType(MAP_TYPE_SATELLITE);
break;
case "Terrain":
map.setMapType(MAP_TYPE_TERRAIN);
break;
case "None":
map.setMapType(MAP_TYPE_NONE);
break;
default:
map.setMapType(MAP_TYPE_NORMAL);
break;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
}